home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 2010 April / PCWorld0410.iso / hity wydania / Ubuntu 9.10 PL / karmelkowy-koliberek-desktop-9.10-i386-PL.iso / casper / filesystem.squashfs / usr / sbin / popularity-contest < prev    next >
Text File  |  2009-06-16  |  4KB  |  157 lines

  1. #!/usr/bin/perl -w
  2. #
  3. # Copyright (C) 2003 by Bill Allombert <ballombe@debian.org>
  4.  
  5. # This program is free software; you can redistribute it and/or modify
  6. # it under the terms of the GNU General Public License as published by
  7. # the Free Software Foundation; either version 2 of the License, or
  8. # (at your option) any later version.
  9. #
  10. # This program is distributed in the hope that it will be useful,
  11. # but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  13. # GNU General Public License for more details.
  14. #
  15. # You should have received a copy of the GNU General Public License
  16. # along with this program; if not, write to the Free Software
  17. # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  18.  
  19. # based on a design and a bash/gawk script
  20. #
  21. # Copyright (C) 1998,2000 by Avery Pennarun, for the Debian Project.
  22. # Use, modify, and redistribute modified or unmodified versions in any
  23. # way you wish.
  24.  
  25. use strict;
  26. use 5.6.0;
  27.  
  28. my $dpkg_db="/var/lib/dpkg/info";
  29. my $popcon_conf="/etc/popularity-contest.conf";
  30.  
  31. my %opts=();
  32.  
  33. # $popcon_conf is in shell-script format
  34. my $HOSTID = qx(unset MY_HOSTID; . $popcon_conf; echo \$MY_HOSTID );
  35.  
  36. chomp $HOSTID;
  37.  
  38. if ( $HOSTID eq "")
  39. {
  40.   print STDERR "You must set MY_HOSTID in $popcon_conf!\n";
  41.   exit 1;
  42. }
  43.  
  44. if ( $HOSTID eq "d41d8cd98f00b204e9800998ecf8427e")
  45. {
  46.   print STDERR "Warning: MY_HOSTID is the md5sum of the empty file!\n";
  47.   print STDERR "Please change it to the md5sum of a random file in $popcon_conf!\n";
  48. }
  49.  
  50. if ( $HOSTID !~ /^([a-f0-9]{32})$/)
  51. {
  52.   print STDERR "Error: MY_HOSTID does not match ^([a-f0-9]{32})\$\n";
  53.   print STDERR "Please edit $popcon_conf to use a valid md5sum value\n";
  54.   exit 1;
  55. }
  56.  
  57. # Architecture.
  58. my $debarch = `dpkg --print-architecture`;
  59. chomp $debarch;
  60.  
  61. # Popcon release
  62. my $popconver=`dpkg-query --showformat='\${version}' --show popularity-contest`;
  63.  
  64. # Initialise time computations
  65.  
  66. my $now = time;
  67. my $daylen = 24 * 60 * 60;
  68. my $monthlen = $daylen * 30;
  69. my $lastmonth = $now - $monthlen;
  70.  
  71. my %popcon=();
  72.  
  73. # List all mapped files
  74. my %mapped;
  75. if (opendir(PROC, "/proc"))
  76. {
  77.   my @procfiles = readdir(PROC);
  78.   closedir(PROC);
  79.  
  80.   foreach (@procfiles)
  81.   {
  82.     -d "/proc/$_" or next;
  83.     m{^[0-9]+$} or next;
  84.  
  85.     open MAPS, "/proc/$_/maps" or next;
  86.     while (<MAPS>)
  87.     {
  88.       m{(/.*)} or next;
  89.       $mapped{$1} = 1;
  90.     }
  91.     close MAPS;
  92.   }
  93. }
  94.  
  95. # Read dpkg database of installed packages
  96. open PACKAGES, "dpkg-query --show --showformat='\${status} \${package}\\n'|";
  97. while (<PACKAGES>)
  98. {
  99.   /^.*installed *(.+)$/ or next;
  100.   my $pkg=$1;
  101.   $popcon{$pkg}=[0,0,$pkg,"<NOFILES>"];
  102.   open FILES, "$dpkg_db/$pkg.list";
  103.   my $bestatime = undef;
  104.   while (<FILES>)
  105.   {
  106.     chop;
  107.     next unless (
  108.      ( m{/bin/|/sbin/|/lib/.+/|^/usr/games/|\.[ah]$|\.pm$|\.php$|^/boot/System\.map-}
  109.        || defined $mapped{$_} )
  110.        && -f $_);
  111.     my($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,
  112.                       $atime,$mtime,$ctime,$blksize,$blocks)
  113.                           = stat;
  114.     if (defined $mapped{$_}) {
  115.       # It's currently being accessed by a process
  116.       $atime = time();
  117.     }
  118.     print STDERR if (!defined($atime));
  119.     if (!defined($bestatime) || $atime >= $bestatime)
  120.     {
  121.       $bestatime=$atime;
  122.       if ($atime < $lastmonth)
  123.       {
  124.         # Not accessed since more than 30 days.
  125.         $popcon{$pkg}=[$atime,$ctime,$pkg,$_,"<OLD>"];
  126.       }
  127.       elsif ($ctime > $lastmonth && $atime-$ctime < $daylen)
  128.       {
  129.         # Installed/upgraded less than a month ago and not used after
  130.         # install/upgrade day.
  131.         $popcon{$pkg}=[$atime,$ctime,$pkg,$_,"<RECENT-CTIME>"];
  132.       }
  133.       else
  134.       {
  135.         # Else we `vote' for the package.
  136.         $popcon{$pkg}=[$atime,$ctime,$pkg,$_];
  137.       }
  138.     }
  139.   }
  140.   close FILES;
  141. }
  142.  
  143. close PACKAGES;
  144.  
  145. # We're not done yet.  Sort the output in reverse by atime, and
  146. # add a header/footer.
  147.  
  148. print "POPULARITY-CONTEST-0 TIME:",time," ID:$HOSTID ".
  149.     "ARCH:$debarch POPCONVER:$popconver\n";
  150.  
  151. for (sort { $popcon{$b}[0] <=> $popcon{$a}[0] } keys %popcon)
  152. {
  153.   print join(' ',@{$popcon{$_}}),"\n";
  154. }
  155.  
  156. print "END-POPULARITY-CONTEST-0 TIME:",time,"\n";
  157.